package com.bnz.search.service.impl;

import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch._types.aggregations.Aggregate;
import co.elastic.clients.elasticsearch._types.aggregations.HistogramBucket;
import co.elastic.clients.elasticsearch._types.aggregations.StringTermsAggregate;
import co.elastic.clients.elasticsearch._types.aggregations.StringTermsBucket;
import co.elastic.clients.elasticsearch._types.query_dsl.MultiMatchQuery;
import co.elastic.clients.elasticsearch._types.query_dsl.Query;
import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders;
import co.elastic.clients.elasticsearch.core.SearchResponse;
import co.elastic.clients.elasticsearch.core.search.Hit;
import com.bnz.search.entity.ItemEntity;
import com.bnz.search.entity.ItemVo;
import com.bnz.search.service.ItemSearchService;
import net.bytebuddy.asm.Advice;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


//@Service
//public class ItemSearchServiceImpl3 implements ItemSearchService {
//    @Autowired
//    private ElasticsearchClient client;
//
//    /**
//     * 1. 进行各种查询
//     * @param vo
//     * @return
//     * @throws IOException
//     */
//    @Override
//    public Map search(ItemVo vo) throws IOException {
//        System.out.println("vo = " + vo);
//        //定义Map集合
//        Map resultMap = new HashMap();
//        //以参数进行查询
//        if(vo != null){
//            if(StringUtils.isNotBlank(vo.getKeywords())){
//                //多字段匹配查询 --- 分开
//                Query matchQuery = MultiMatchQuery.of(m -> m
//                        .fields("title", "brand", "category")
//                        .query(vo.getKeywords())
//                )._toQuery();
//                // Query matchQuery = QueryBuilders.multiMatch(m -> m.fields("title", "brand", "category").query(vo.getKeywords()));
//
//                SearchResponse<ItemEntity> searchResponse = client.search(s -> s
//                                .index("item")
//                                .query(q -> q
//                                                //1.2.1 组合查询 ---> 多字段关键字查询
//                                                .bool(b -> b
//                                                        .filter(matchQuery))
//                                        // .multiMatch(m -> m
//                                        // 	.fields("title", "brand", "category")
//                                        // 	.query(vo.getKeywords()))
//                                )
//
//                                //高亮
//                                .highlight(h -> h
//                                        .preTags("<font color='red'>")      //标签
//                                        .postTags("</font>")                //标签
//                                        .fields("title",highlightField->highlightField)) //字段
//                                //分组查询
//                                .aggregations("category-group",
//                                        a -> a
//                                                .terms(t->t    //指定分组名称
//                                                        .field("category")))   //分组字段
//
//                        , ItemEntity.class);
//                //得到查询结果
//                List<Hit<ItemEntity>> hits = searchResponse.hits().hits();
//
//                //遍历
//                //定义存放查询结果的集合
//                List<ItemEntity> itemEntities = new ArrayList<>();
//                for (Hit<ItemEntity> hit : hits) {
//                    //得到查询结果的一个对象
//                    ItemEntity entity = hit.source();
//                    //到高亮查询字段的值(key: 代表高亮的字段名,值就是经过查询得到的高亮字段值（包含有前缀及后缀）)
//                    Map<String, List<String>> highlight = hit.highlight();
//                    List<String> list = highlight.get("title");
//                    //高亮查询title字段
//                    entity.setTitle(!CollectionUtils.isEmpty(list) ? list.get(0) : entity.getTitle());
//                    System.out.println("entity = " + entity);
//                    //将查询结果放到的集合中
//                    itemEntities.add(entity);
//
//
//                }
//                StringTermsAggregate sterms = searchResponse.aggregations().get("category-group")
//                        .sterms();
//
//                List<String> categorys = new ArrayList<>();
//                List<StringTermsBucket> buckets = sterms.buckets().array();
//                for (StringTermsBucket bucket : buckets) {
//                    String key = bucket.key();
//                    categorys.add(key);
//                }
//
//                //1.5 将查询的list集合放到大的map集合中
//                resultMap.put("itemList",itemEntities);
//                resultMap.put("categoryList",categorys);
//
//                System.out.println("categorys = " + categorys);
//            }
//        }
//
//
//        return resultMap;
//    }@Override
//    public Map search(ItemVo vo) throws IOException{
//        System.out.println("vo = " + vo);
//        //1.1 定义返回的Map集合
//        Map resultMap = new HashMap();
//        //1.2 根据传入的参数进行查询
//        if(vo != null){
//            if(StringUtils.isNotBlank(vo.getKeywords())){
//                //多字段查询，分离开的写法
//                Query matchQuery = MultiMatchQuery.of(m -> m
//                        .fields("title", "brand", "category")
//                        .query(vo.getKeywords())
//                )._toQuery();
//                // Query matchQuery = QueryBuilders.multiMatch(m -> m.fields("title", "brand", "category").query(vo.getKeywords()));
//
//                SearchResponse<ItemEntity> searchResponse = client.search(s -> s
//                                .index("item")
//                                .query(q -> q
//                                                //1.2.1 组合查询 ---> 多字段关键字查询
//                                                .bool(b -> b
//                                                        .filter(matchQuery))
//                                        // .multiMatch(m -> m
//                                        // 	.fields("title", "brand", "category")
//                                        // 	.query(vo.getKeywords()))
//                                )
//
//                                //1.2.2 高亮查询
//                                .highlight(h -> h
//                                        .preTags("<font color='red'>")      //前缀标签
//                                        .postTags("</font>")                //后缀标签
//                                        .fields("title",highlightField->highlightField)) //高亮查询的字段
//                                //1.2.3 分组查询
//                                .aggregations("category-group",
//                                        a -> a
//                                                .terms(t->t
//                                                        .field("category")))
//
//                        , ItemEntity.class);
//                //1.3 得到查询结果
//                List<Hit<ItemEntity>> hits = searchResponse.hits().hits();
//
//                //1.4 遍历查询结果
//                //1.4.1 定义存放查询结果的集合
//                List<ItemEntity> itemEntities = new ArrayList<>();
//                for (Hit<ItemEntity> hit : hits) {
//                    //1.4.2 得到查询结果的一个对象
//                    ItemEntity entity = hit.source();
//                    //1.4.3 得到高亮查询字段的值(key: 代表高亮的字段名,值就是经过查询得到的高亮字段值（包含有前缀及后缀）,<font color='red'>老人</font>)
//                    Map<String, List<String>> highlight = hit.highlight();
//                    List<String> list = highlight.get("title");
//                    //1.4.4 将高亮查询的字段值设置到entity的title字段
//                    entity.setTitle(!CollectionUtils.isEmpty(list) ? list.get(0) : entity.getTitle());
//                    System.out.println("entity = " + entity);
//                    //1.4.5 将查询结果放到上面的集合中
//                    itemEntities.add(entity);
//
//
//                }
//                StringTermsAggregate sterms = searchResponse.aggregations().get("category-group")
//                        .sterms();
//
//                List<String> categorys = new ArrayList<>();
//                List<StringTermsBucket> buckets = sterms.buckets().array();
//                for (StringTermsBucket bucket : buckets) {
//                    String key = bucket.key();
//                    categorys.add(key);
//                }
//
//                //1.5 将查询的list集合放到大的map集合中
//                resultMap.put("itemList",itemEntities);
//                resultMap.put("categoryList",categorys);
//
//                System.out.println("categorys = " + categorys);
//            }
//        }
//
//
//        return resultMap;
//    }
//}
